From ab788348a9ca8d63239c306921b0b1d51affea51 Mon Sep 17 00:00:00 2001 From: tsteven4 <13596209+tsteven4@users.noreply.github.com> Date: Sun, 29 Oct 2023 18:35:42 -0600 Subject: [PATCH] consolidate handling of extensions in gpx writer. (#1200) This is a user visible change. Previously if gARmIN sPECIAL dATA existed and both garminextensions and humminbirdextensions were false then the gpx writer would write a subset if it (and not passthrough any gpx -> gpx data.) If gARmIN sPECIAL dATA existed and either extension option was true, then a different subset would be written (and any gpx -> gpx data would not be passed through.) Now the garminextensions option must used to have any gARmIN sPECIAL dATA data written. Previously, when passing through extension data from the gpx reader to the gpx writer, some elements of the garmin and humminbird extensions were not included. Now, all foreign elements are included. As before, passthrough is only used when both extension options are false. --- garmin_fs.cc | 66 ------------ garmin_fs.h | 1 - gpx.cc | 72 ++++++++----- gpx.h | 48 +++++---- reference/basecamp~gpx.gpx | 10 +- reference/gdb-sample-v3-ilinks.gpx | 33 ++++++ reference/multiple-links.gpx | 5 - reference/umsonstdraussen.gpx | 162 ++++++++++++++--------------- testo.d/garmin_gpi.test | 2 +- 9 files changed, 197 insertions(+), 202 deletions(-) diff --git a/garmin_fs.cc b/garmin_fs.cc index c6846efce..d00f4a0c3 100644 --- a/garmin_fs.cc +++ b/garmin_fs.cc @@ -78,72 +78,6 @@ garmin_fs_t::~garmin_fs_t() /* GPX - out */ -void -garmin_fs_xml_fprint(const Waypoint* waypt, - gpsbabel::XmlStreamWriter* writer) -{ - garmin_fs_t* gmsd = garmin_fs_t::find(waypt); - - writer->stackOptionalStartElement(QStringLiteral("extensions")); - writer->stackOptionalStartElement(QStringLiteral("gpxx:WaypointExtension")); - writer->stackNamespace(QStringLiteral("http://www.garmin.com/xmlschemas/GpxExtensions/v3"), - "gpxx"); - - if (waypt->proximity_has_value()) { - writer->stackTextElement(QStringLiteral("gpxx:Proximity"), QString::number(waypt->proximity_value(), 'f', 6)); - } - - if (waypt->temperature_has_value()) { - writer->stackTextElement(QStringLiteral("gpxx:Temperature"), QString::number(waypt->temperature_value(), 'f', 6)); - } - - if (waypt->depth_has_value()) { - writer->stackTextElement(QStringLiteral("gpxx:Depth"), QString::number(waypt->depth_value(), 'f', 6)); - } - - if (garmin_fs_t::has_display(gmsd)) { - const char* cx; - switch (gmsd->display) { - case gt_display_mode_symbol: - cx = "SymbolOnly"; - break; - case gt_display_mode_symbol_and_comment: - cx = "SymbolAndDescription"; - break; - default: - cx = "SymbolAndName"; - break; - } - writer->stackTextElement(QStringLiteral("gpxx:DisplayMode"), cx); - } - - if (garmin_fs_t::has_category(gmsd)) { - uint16_t cx = gmsd->category; - writer->stackStartElement(QStringLiteral("gpxx:Categories")); - for (int i = 0; i < 16; i++) { - if (cx & 1) { - writer->stackTextElement(QStringLiteral("gpxx:Category"), QStringLiteral("Category %1").arg(i+1)); - } - cx = cx >> 1; - } - writer->stackEndElement(); // gpxx:Categories - } - - writer->stackOptionalStartElement(QStringLiteral("gpxx:Address")); - writer->stackOptionalTextElement(QStringLiteral("gpxx:StreetAddress"), garmin_fs_t::get_addr(gmsd, nullptr)); - writer->stackOptionalTextElement(QStringLiteral("gpxx:City"), garmin_fs_t::get_city(gmsd, nullptr)); - writer->stackOptionalTextElement(QStringLiteral("gpxx:State"), garmin_fs_t::get_state(gmsd, nullptr)); - writer->stackOptionalTextElement(QStringLiteral("gpxx:Country"), garmin_fs_t::get_country(gmsd, nullptr)); - writer->stackOptionalTextElement(QStringLiteral("gpxx:PostalCode"), garmin_fs_t::get_postal_code(gmsd, nullptr)); - writer->stackEndElement(); // gpxx:Address - - writer->stackOptionalTextElement(QStringLiteral("gpxx:PhoneNumber"), garmin_fs_t::get_phone_nr(gmsd, nullptr)); - - - writer->stackEndElement(); // gpxx:WaypointExtension - writer->stackEndElement(); // extensions -} - void garmin_fs_xml_convert(const int base_tag, int tag, const QString& qstr, Waypoint* waypt) { diff --git a/garmin_fs.h b/garmin_fs.h index d225339dc..fb39b5b90 100644 --- a/garmin_fs.h +++ b/garmin_fs.h @@ -221,7 +221,6 @@ void garmin_fs_copy(void** dest, const void* src); /* for GPX */ void garmin_fs_xml_convert(int base_tag, int tag, const QString& qstr, Waypoint* waypt); -void garmin_fs_xml_fprint(const Waypoint* waypt, gpsbabel::XmlStreamWriter*); /* common garmin_fs utilities */ diff --git a/gpx.cc b/gpx.cc index ad5bfcaaa..45c7606e5 100644 --- a/gpx.cc +++ b/gpx.cc @@ -47,7 +47,7 @@ #include // for qAsConst, QAddConst<>::Type #include "defs.h" -#include "garmin_fs.h" // for garmin_fs_xml_convert, garmin_fs_xml_fprint, GMSD_FIND +#include "garmin_fs.h" // for garmin_fs_t, garmin_ilink_t, garmin_fs_xml_convert #include "garmin_tables.h" // for gt_color_index_by_rgb, gt_color_name, gt_color_value_by_name #include "geocache.h" // for Geocache, Geocache::UtfSt... #include "mkshort.h" // for MakeShort @@ -1266,7 +1266,6 @@ GpxFormat::gpx_write_common_extensions(const Waypoint* waypointp, const gpx_poin { assert(gpx_write_version >= gpx_1_1); - writer->stackOptionalStartElement(QStringLiteral("extensions")); if (opt_humminbirdext) { @@ -1283,6 +1282,7 @@ GpxFormat::gpx_write_common_extensions(const Waypoint* waypointp, const gpx_poin // Although not required by the schema we assume that gpxx:RoutePointExtension must be a child of gpx:rtept. // Although not required by the schema we assume that gpxx:TrackPointExtension must be a child of gpx:trkpt. // Although not required by the schema we assume that gpxtpx:TrackPointExtension must be a child of gpx:trkpt. + garmin_fs_t* gmsd = garmin_fs_t::find(waypointp); switch (point_type) { case gpxpt_waypoint: writer->stackOptionalStartElement(QStringLiteral("gpxx:WaypointExtension")); @@ -1295,10 +1295,48 @@ GpxFormat::gpx_write_common_extensions(const Waypoint* waypointp, const gpx_poin if (waypointp->depth_has_value()) { writer->stackTextElement(QStringLiteral("gpxx:Depth"), toString(waypointp->depth_value())); } + + if (garmin_fs_t::has_display(gmsd)) { + const char* cx; + switch (gmsd->display) { + case gt_display_mode_symbol: + cx = "SymbolOnly"; + break; + case gt_display_mode_symbol_and_comment: + cx = "SymbolAndDescription"; + break; + default: + cx = "SymbolAndName"; + break; + } + writer->stackTextElement(QStringLiteral("gpxx:DisplayMode"), cx); + } + + if (garmin_fs_t::has_category(gmsd)) { + uint16_t cx = gmsd->category; + writer->stackStartElement(QStringLiteral("gpxx:Categories")); + for (int i = 0; i < 16; i++) { + if (cx & 1) { + writer->stackTextElement(QStringLiteral("gpxx:Category"), QStringLiteral("Category %1").arg(i+1)); + } + cx = cx >> 1; + } + writer->stackEndElement(); // gpxx:Categories + } + + writer->stackOptionalStartElement(QStringLiteral("gpxx:Address")); + writer->stackOptionalTextElement(QStringLiteral("gpxx:StreetAddress"), garmin_fs_t::get_addr(gmsd, nullptr)); + writer->stackOptionalTextElement(QStringLiteral("gpxx:City"), garmin_fs_t::get_city(gmsd, nullptr)); + writer->stackOptionalTextElement(QStringLiteral("gpxx:State"), garmin_fs_t::get_state(gmsd, nullptr)); + writer->stackOptionalTextElement(QStringLiteral("gpxx:Country"), garmin_fs_t::get_country(gmsd, nullptr)); + writer->stackOptionalTextElement(QStringLiteral("gpxx:PostalCode"), garmin_fs_t::get_postal_code(gmsd, nullptr)); + writer->stackEndElement(); // gpxx:Address + + writer->stackOptionalTextElement(QStringLiteral("gpxx:PhoneNumber"), garmin_fs_t::get_phone_nr(gmsd, nullptr)); + writer->stackEndElement(); // gpxx:WaypointExtension break; - case gpxpt_route: { - garmin_fs_t* gmsd = garmin_fs_t::find(waypointp); + case gpxpt_route: if (gmsd != nullptr && gmsd->ilinks != nullptr) { writer->stackOptionalStartElement(QStringLiteral("gpxx:RoutePointExtension")); garmin_ilink_t* link = gmsd->ilinks; @@ -1315,8 +1353,7 @@ GpxFormat::gpx_write_common_extensions(const Waypoint* waypointp, const gpx_poin } writer->stackEndElement(); // gpxx:RoutePointExtension } - } - break; + break; case gpxpt_track: // gpxtpx:TrackPointExtension is a replacement for gpxx:TrackPointExtension. writer->stackOptionalStartElement(QStringLiteral("gpxtpx:TrackPointExtension")); @@ -1387,23 +1424,8 @@ GpxFormat::gpx_waypt_pr(const Waypoint* waypointp) const if (!(opt_humminbirdext || opt_garminext)) { const auto* fs_gpx = reinterpret_cast(waypointp->fs.FsChainFind(kFsGpx)); - auto* gmsd = garmin_fs_t::find(waypointp); /* gARmIN sPECIAL dATA */ - if (fs_gpx) { - if (! gmsd) { - if (fs_gpx->tag) { - if (gpx_write_version > gpx_1_0) { - writer->writeStartElement("extensions"); - } - fprint_xml_chain(fs_gpx->tag); - if (gpx_write_version > gpx_1_0) { - writer->writeEndElement(); - } - } - } - } - if (gmsd && (gpx_write_version > gpx_1_0)) { - /* MapSource doesn't accepts extensions from 1.0 */ - garmin_fs_xml_fprint(waypointp, writer); + if (fs_gpx && fs_gpx->tag) { + fprint_xml_chain(fs_gpx->tag); } } else { gpx_write_common_extensions(waypointp, gpxpt_waypoint); @@ -1430,7 +1452,7 @@ GpxFormat::gpx_track_hdr(const route_head* rte) if (fs_gpx) { fprint_xml_chain(fs_gpx->tag); } - } else if (opt_garminext && (gpx_write_version > gpx_1_0)) { + } else if (opt_garminext) { if (rte->line_color.bbggrr > unknown_color) { int ci = gt_color_index_by_rgb(rte->line_color.bbggrr); if (ci > 0) { @@ -1518,7 +1540,7 @@ GpxFormat::gpx_route_hdr(const route_head* rte) const if (fs_gpx) { fprint_xml_chain(fs_gpx->tag); } - } else if (opt_garminext && (gpx_write_version > gpx_1_0)) { + } else if (opt_garminext) { if (rte->line_color.bbggrr > unknown_color) { int ci = gt_color_index_by_rgb(rte->line_color.bbggrr); if (ci > 0) { diff --git a/gpx.h b/gpx.h index 0fee9ae46..a658404ba 100644 --- a/gpx.h +++ b/gpx.h @@ -76,12 +76,12 @@ private: */ struct gpx_wpt_fsdata : FormatSpecificData { gpx_wpt_fsdata() : FormatSpecificData(kFsGpxWpt) {} - + gpx_wpt_fsdata* clone() const override { return new gpx_wpt_fsdata(*this); } - + QString magvar; QString src; QString type; @@ -200,8 +200,14 @@ private: }; struct tag_mapping { - tag_type type{tt_unknown}; /* enum from above for this tag */ - bool passthrough{true}; /* true if we don't generate this */ + tag_type type{tt_unknown}; /* enum from above for this tag */ + /* + * passthrough should be true for + * 1) The gpx 1.1 extensions element and any descendents. + * 2) Any element from a foreign (non gpx) namespace and any descendents. + * This rule is necessary for gpx 1.0. + */ + bool passthrough{true}; }; @@ -373,29 +379,29 @@ private: {"/gpx/wpt/groundspeak:cache/groundspeak:logs/groundspeak:log/groundspeak:type", {tt_cache_log_type, true}}, {"/gpx/wpt/groundspeak:cache/groundspeak:logs/groundspeak:log/groundspeak:date", {tt_cache_log_date, true}}, - {"/gpx/wpt/extensions", {tt_wpt_extensions, false}}, + {"/gpx/wpt/extensions", {tt_wpt_extensions, true}}, - {GARMIN_WPT_EXT, {tt_garmin_wpt_extensions, false}}, - {GARMIN_WPT_EXT "/gpxx:Proximity", {tt_garmin_wpt_proximity, false}}, - {GARMIN_WPT_EXT "/gpxx:Temperature", {tt_garmin_wpt_temperature, false}}, + {GARMIN_WPT_EXT, {tt_garmin_wpt_extensions, true}}, + {GARMIN_WPT_EXT "/gpxx:Proximity", {tt_garmin_wpt_proximity, true}}, + {GARMIN_WPT_EXT "/gpxx:Temperature", {tt_garmin_wpt_temperature, true}}, {GARMIN_TRKPT_EXT "/gpxtpx:atemp", {tt_garmin_wpt_temperature, true}}, - {GARMIN_WPT_EXT "/gpxx:Depth", {tt_garmin_wpt_depth, false}}, - {GARMIN_WPT_EXT "/gpxx:DisplayMode", {tt_garmin_wpt_display_mode, false}}, - {GARMIN_WPT_EXT "/gpxx:Categories", {tt_garmin_wpt_categories, false}}, - {GARMIN_WPT_EXT "/gpxx:Categories/gpxx:Category", {tt_garmin_wpt_category, false}}, - {GARMIN_WPT_EXT "/gpxx:Address/gpxx:StreetAddress", {tt_garmin_wpt_addr, false}}, - {GARMIN_WPT_EXT "/gpxx:Address/gpxx:City", {tt_garmin_wpt_city, false}}, - {GARMIN_WPT_EXT "/gpxx:Address/gpxx:State", {tt_garmin_wpt_state, false}}, - {GARMIN_WPT_EXT "/gpxx:Address/gpxx:Country", {tt_garmin_wpt_country, false}}, - {GARMIN_WPT_EXT "/gpxx:Address/gpxx:PostalCode", {tt_garmin_wpt_postal_code, false}}, - {GARMIN_WPT_EXT "/gpxx:PhoneNumber", {tt_garmin_wpt_phone_nr, false}}, + {GARMIN_WPT_EXT "/gpxx:Depth", {tt_garmin_wpt_depth, true}}, + {GARMIN_WPT_EXT "/gpxx:DisplayMode", {tt_garmin_wpt_display_mode, true}}, + {GARMIN_WPT_EXT "/gpxx:Categories", {tt_garmin_wpt_categories, true}}, + {GARMIN_WPT_EXT "/gpxx:Categories/gpxx:Category", {tt_garmin_wpt_category, true}}, + {GARMIN_WPT_EXT "/gpxx:Address/gpxx:StreetAddress", {tt_garmin_wpt_addr, true}}, + {GARMIN_WPT_EXT "/gpxx:Address/gpxx:City", {tt_garmin_wpt_city, true}}, + {GARMIN_WPT_EXT "/gpxx:Address/gpxx:State", {tt_garmin_wpt_state, true}}, + {GARMIN_WPT_EXT "/gpxx:Address/gpxx:Country", {tt_garmin_wpt_country, true}}, + {GARMIN_WPT_EXT "/gpxx:Address/gpxx:PostalCode", {tt_garmin_wpt_postal_code, true}}, + {GARMIN_WPT_EXT "/gpxx:PhoneNumber", {tt_garmin_wpt_phone_nr, true}}, // In Garmin space, but in core of waypoint. {GARMIN_TRKPT_EXT "/gpxtpx:hr", {tt_trk_trkseg_trkpt_heartrate, true}}, {GARMIN_TRKPT_EXT "/gpxtpx:cad", {tt_trk_trkseg_trkpt_cadence, true}}, - {"/gpx/wpt/extensions/h:depth", {tt_humminbird_wpt_depth, false}}, // in centimeters. - {"/gpx/wpt/extensions/h:status", {tt_humminbird_wpt_status, false}}, + {"/gpx/wpt/extensions/h:depth", {tt_humminbird_wpt_depth, true}}, // in centimeters. + {"/gpx/wpt/extensions/h:status", {tt_humminbird_wpt_status, true}}, {"/gpx/rte", {tt_rte, false}}, {"/gpx/rte/name", {tt_rte_name, false}}, @@ -426,7 +432,7 @@ private: {"/gpx/trk/trkseg/trkpt/course", {tt_trk_trkseg_trkpt_course, false}}, {"/gpx/trk/trkseg/trkpt/speed", {tt_trk_trkseg_trkpt_speed, false}}, - {"/gpx/trk/trkseg/trkpt/extensions/h:depth", {tt_humminbird_trk_trkseg_trkpt_depth, false}}, // in centimeters. + {"/gpx/trk/trkseg/trkpt/extensions/h:depth", {tt_humminbird_trk_trkseg_trkpt_depth, true}}, // in centimeters. /* Common to tracks, routes, and waypts */ GPXWPTTYPETAG("ele", tt_wpttype_ele, false), diff --git a/reference/basecamp~gpx.gpx b/reference/basecamp~gpx.gpx index fe07c4a21..a40ffecca 100644 --- a/reference/basecamp~gpx.gpx +++ b/reference/basecamp~gpx.gpx @@ -15,8 +15,11 @@ Flag, Blue user - + SymbolAndName + + Unlisted Data + @@ -28,8 +31,11 @@ Flag, Blue user - + SymbolAndName + + Unlisted Data + diff --git a/reference/gdb-sample-v3-ilinks.gpx b/reference/gdb-sample-v3-ilinks.gpx index eb81cd6c7..618c987ed 100644 --- a/reference/gdb-sample-v3-ilinks.gpx +++ b/reference/gdb-sample-v3-ilinks.gpx @@ -10,6 +10,11 @@ Birch Harbor Birch Harbor City (Small) + + + SymbolAndName + + @@ -17,6 +22,11 @@ Gouldsboro Gouldsboro City (Small) + + + SymbolAndName + + @@ -24,6 +34,11 @@ Prospect Harbor Prospect Harbor City (Small) + + + SymbolAndName + + @@ -37,6 +52,19 @@ Schoodic Loop Rd Winter Harbor Twn, Maine, 04693, United States 207-288-1300 Campground + + + SymbolAndName + + Schoodic Loop Rd + Winter Harbor Twn + Maine + United States + 04693 + + 207-288-1300 + + @@ -44,6 +72,11 @@ Winter Harbor Twn, Maine, 04693, United States Sullivan Twn Sullivan Twn City (Small) + + + SymbolAndName + + Trip to Schoodic Woods Campground - Day 1 diff --git a/reference/multiple-links.gpx b/reference/multiple-links.gpx index fcc2159d6..e76b718ec 100644 --- a/reference/multiple-links.gpx +++ b/reference/multiple-links.gpx @@ -20,10 +20,5 @@ three dots Waypoint - - - SymbolAndDescription - - diff --git a/reference/umsonstdraussen.gpx b/reference/umsonstdraussen.gpx index 2361b770c..096bfdd8d 100644 --- a/reference/umsonstdraussen.gpx +++ b/reference/umsonstdraussen.gpx @@ -1,5 +1,5 @@ - + @@ -13,7 +13,7 @@ Waypoint - + Luitpoldstrasse Freising @@ -32,7 +32,7 @@ Waypoint - + Zeughausstrasse Darmstadt @@ -51,7 +51,7 @@ Waypoint - + Bretten / Grillplatz / B 35 Bretten @@ -69,7 +69,7 @@ Waypoint - + Alter Elbtunnel / St. Pauli Landungsbrücken Hamburg @@ -88,7 +88,7 @@ Waypoint - + Heubergpark / Alte Roßmühlstraße Wesel @@ -106,7 +106,7 @@ Waypoint - + Prinzipalmarkt Münster @@ -125,7 +125,7 @@ Waypoint - + Frönsberg Hemer @@ -136,14 +136,14 @@ Umsonst + Draußen Würzburg - Line Up: Aeon of Decay, Aloha From Hell, Benni Hemm Hemm, Better Ones, Blocking Element, Bons Balls, Boppin B, Breakfast Killers, Brut Boogaloo, Diego, Enuff, Faint, Falling to Dust, Fiatonic, Frittenbude, Fuck your Shadow from behind, Fuenf, Ghost Rockets, Gold Minor, Guitar Challenge Spectacle, Hank Cash, Jamaze, Jane Doe, Jerry Lain, JZ James Trio, Karlsson, Kashiwa Daisuke, Mama Boom, Mama s Gun, Markus Rill, Melomania, Other Generations Anthem, Palpitation, Sam Isaac Acoustic Trio, Schöne Schaisse, Senore Matze Rossi, Signals to Airkraft, Sorrow Remains, Spaceship Bismark, Steffi-Mira-Band, Superpunk, Surfing Hundekuchen, Tequila Terminators, The Robocop Kraus, Unter Tagen, Vladiwoodstok, Worst Thoughts. Datum: 19.06. - 21.06.2009, Beginn: 17:00 Uhr. - Line Up: Aeon of Decay, Aloha From Hell, Benni Hemm Hemm, Better Ones, Blocking Element, Bons Balls, Boppin B, Breakfast Killers, Brut Boogaloo, Diego, Enuff, Faint, Falling to Dust, Fiatonic, Frittenbude, Fuck your Shadow from behind, Fuenf, Ghost Rockets, Gold Minor, Guitar Challenge Spectacle, Hank Cash, Jamaze, Jane Doe, Jerry Lain, JZ James Trio, Karlsson, Kashiwa Daisuke, Mama Boom, Mama s Gun, Markus Rill, Melomania, Other Generations Anthem, Palpitation, Sam Isaac Acoustic Trio, Schöne Schaisse, Senore Matze Rossi, Signals to Airkraft, Sorrow Remains, Spaceship Bismark, Steffi-Mira-Band, Superpunk, Surfing Hundekuchen, Tequila Terminators, The Robocop Kraus, Unter Tagen, Vladiwoodstok, Worst Thoughts. Datum: 19.06. - 21.06.2009, Beginn: 17:00 Uhr. + Line Up: Aeon of Decay, Aloha From Hell, Benni Hemm Hemm, Better Ones, Blocking Element, Bons Balls, Boppin B, Breakfast Killers, Brut Boogaloo, Diego, Enuff, Faint, Falling to Dust, Fiatonic, Frittenbude, Fuck your Shadow from behind, Fuenf, Ghost Rockets, Gold Minor, Guitar Challenge Spectacle, Hank Cash, Jamaze, Jane Doe, Jerry Lain, JZ James Trio, Karlsson, Kashiwa Daisuke, Mama Boom, Mamas Gun, Markus Rill, Melomania, Other Generations Anthem, Palpitation, Sam Isaac Acoustic Trio, Schöne Schaisse, Senore Matze Rossi, Signals to Airkraft, Sorrow Remains, Spaceship Bismark, Steffi-Mira-Band, Superpunk, Surfing Hundekuchen, Tequila Terminators, The Robocop Kraus, Unter Tagen, Vladiwoodstok, Worst Thoughts. Datum: 19.06. - 21.06.2009, Beginn: 17:00 Uhr. + Line Up: Aeon of Decay, Aloha From Hell, Benni Hemm Hemm, Better Ones, Blocking Element, Bons Balls, Boppin B, Breakfast Killers, Brut Boogaloo, Diego, Enuff, Faint, Falling to Dust, Fiatonic, Frittenbude, Fuck your Shadow from behind, Fuenf, Ghost Rockets, Gold Minor, Guitar Challenge Spectacle, Hank Cash, Jamaze, Jane Doe, Jerry Lain, JZ James Trio, Karlsson, Kashiwa Daisuke, Mama Boom, Mamas Gun, Markus Rill, Melomania, Other Generations Anthem, Palpitation, Sam Isaac Acoustic Trio, Schöne Schaisse, Senore Matze Rossi, Signals to Airkraft, Sorrow Remains, Spaceship Bismark, Steffi-Mira-Band, Superpunk, Surfing Hundekuchen, Tequila Terminators, The Robocop Kraus, Unter Tagen, Vladiwoodstok, Worst Thoughts. Datum: 19.06. - 21.06.2009, Beginn: 17:00 Uhr. www.umsonst-und-draussen.de Waypoint - + Talavera Würzburg @@ -162,7 +162,7 @@ Waypoint - + Kasernenstrasse Bad Kissingen @@ -180,7 +180,7 @@ Waypoint - + Solebadstrasse Bad Salzdetfurth @@ -198,7 +198,7 @@ Waypoint - + Zwischen Potsdamer und Berliner Ufer Hamburg @@ -216,7 +216,7 @@ Waypoint - + Parkanlage Stuttgart-Rohr Stuttgart @@ -235,7 +235,7 @@ Waypoint - + Himmelreichgelände bei den Hessenhöfen Blaubeuren @@ -253,7 +253,7 @@ Waypoint - + Ossenbergweg Hünxe @@ -271,7 +271,7 @@ Waypoint - + Rappenberghalde Tübingen @@ -290,7 +290,7 @@ Waypoint - + Ginsterweg Bad Wildbad @@ -308,7 +308,7 @@ Waypoint - + Zuiderpark Den Haag @@ -326,7 +326,7 @@ Waypoint - + Im Löwental Essen @@ -345,7 +345,7 @@ Waypoint - + Neu-Isenburg Neu-Isenburg @@ -363,7 +363,7 @@ Waypoint - + Straubenhardt 75334 @@ -380,7 +380,7 @@ Waypoint - + Hafenstraße Hamm @@ -399,7 +399,7 @@ Waypoint - + Heidjerstraße Weener @@ -418,7 +418,7 @@ Waypoint - + Altstadt Iserlohn @@ -436,7 +436,7 @@ Waypoint - + Günther-Klutz-Anlage Karlsruhe @@ -455,7 +455,7 @@ Waypoint - + Donauinsel Wien @@ -474,7 +474,7 @@ Waypoint - + Obstmarkt Backnang @@ -493,7 +493,7 @@ Waypoint - + Am Kohschultenhof Lingen @@ -511,7 +511,7 @@ Waypoint - + Falkenstein Donnersdorf-Falkenstein @@ -530,7 +530,7 @@ Waypoint - + Schloßberg Pegnitz @@ -548,7 +548,7 @@ Waypoint - + Firstwaldstrasse Mössingen @@ -566,7 +566,7 @@ Waypoint - + Weserwiese Veltheim Vlotho @@ -584,7 +584,7 @@ Waypoint - + Hintere Insel Lindau @@ -602,7 +602,7 @@ Waypoint - + Am Saupurzl Karlstadt @@ -620,7 +620,7 @@ Waypoint - + Heubach 73540 @@ -637,7 +637,7 @@ Waypoint - + Volksfestplatz am Stadion Erding @@ -656,7 +656,7 @@ Waypoint - + Südwinsen 29308 @@ -673,7 +673,7 @@ Waypoint - + Andlauer Weg Berlin @@ -691,7 +691,7 @@ Waypoint - + Freizeitpark Rheinaue Bonn @@ -710,7 +710,7 @@ Waypoint - + Stadionweg Garching @@ -728,7 +728,7 @@ Waypoint - + im Lerchenfeld Dornstadt bei Ulm @@ -746,7 +746,7 @@ Waypoint - + Riedweg Hausen am Andelsbach @@ -765,7 +765,7 @@ Waypoint - + Karlsstraße Reutlingen @@ -783,7 +783,7 @@ Waypoint - + Noch nicht bekannt Mönchengladbach @@ -801,7 +801,7 @@ Waypoint - + Am Werratalsee Schwebda @@ -820,7 +820,7 @@ Waypoint - + Liebigstraße Flörsheim @@ -839,7 +839,7 @@ Waypoint - + Rathausplatz Meldorf @@ -857,7 +857,7 @@ Waypoint - + Innenstadt Nürnberg Nürnberg @@ -876,7 +876,7 @@ Waypoint - + Innenstadt Regensburg Regensburg @@ -894,7 +894,7 @@ Waypoint - + Innenstadt Bochum Bochum @@ -913,7 +913,7 @@ Waypoint - + Schießmauer Herrenberg @@ -931,7 +931,7 @@ Waypoint - + Firstwaldstrasse Mössingen @@ -949,7 +949,7 @@ Waypoint - + Weserwiese Veltheim Vlotho @@ -967,7 +967,7 @@ Waypoint - + Volksfestplatz am Stadion Erding @@ -986,7 +986,7 @@ Waypoint - + Moorfleeter Deich Hamburg @@ -1004,7 +1004,7 @@ Waypoint - + Geinsheimer Straße Riedstadt-Leeheim @@ -1023,7 +1023,7 @@ Waypoint - + An den St Pauli Landungsbrücken Hamburg @@ -1041,7 +1041,7 @@ Waypoint - + Pfaffenwaldring Stuttgart @@ -1059,7 +1059,7 @@ Waypoint - + Koppelbergstrasse Teterow @@ -1077,7 +1077,7 @@ Waypoint - + Ilweder Strasse Stemwede-Haldem @@ -1095,7 +1095,7 @@ Waypoint - + Festivalgelände Bakum (Büschel) @@ -1113,7 +1113,7 @@ Waypoint - + Schlossstraße Hofheim @@ -1131,7 +1131,7 @@ Waypoint - + Oberransbach Feuchtwangen @@ -1149,7 +1149,7 @@ Waypoint - + Am Rheinufer/In der Reduit Mainz-Kastel @@ -1167,7 +1167,7 @@ Waypoint - + Römersee Bad Rappenau-Zimmerhof @@ -1185,7 +1185,7 @@ Waypoint - + Vestische Straße Oberhausen @@ -1203,7 +1203,7 @@ Waypoint - + Thomasstrasse Halver @@ -1221,7 +1221,7 @@ Waypoint - + Werdensteinstrasse Dellmensingen bei Ulm @@ -1239,7 +1239,7 @@ Waypoint - + Holter Straße Schloß Holte-Stukenbrock @@ -1257,7 +1257,7 @@ Waypoint - + Am Gogenkrog Neustadt in Holstein @@ -1276,7 +1276,7 @@ Waypoint - + Höllchenstrasse Dörnberg @@ -1295,7 +1295,7 @@ Waypoint - + An der alten Kirche Krefeld @@ -1314,7 +1314,7 @@ Waypoint - + Kennedyplatz Essen @@ -1333,7 +1333,7 @@ Waypoint - + Peschmannstrasse Duisburg @@ -1351,7 +1351,7 @@ Waypoint - + Am Steinchen Neu-Anspach @@ -1369,7 +1369,7 @@ Waypoint - + Grindelhof/Siemersallee/Allendeplatz Hamburg @@ -1387,7 +1387,7 @@ Waypoint - + Flögger Strand Fehmarn @@ -1406,7 +1406,7 @@ Waypoint - + Treuchtlingen Ri. Möhren, links Ri. Haag Treuchtlingen @@ -1425,7 +1425,7 @@ Waypoint - + An den Klärteichen Emsdetten diff --git a/testo.d/garmin_gpi.test b/testo.d/garmin_gpi.test index a58c3b175..57faa0936 100644 --- a/testo.d/garmin_gpi.test +++ b/testo.d/garmin_gpi.test @@ -17,7 +17,7 @@ compare ${REFERENCE}/gpi_ext-sample.csv ${TMPDIR}/gpi_ext-sample.csv # Don't test writing this sample file from garminonline.de/extras/poi, but # prove we can read it -gpsbabel -i garmin_gpi -f ${REFERENCE}/umsonstdraussen.gpi -o gpx,gpxver=1.1 -F ${TMPDIR}/umsonstdraussen.gpx +gpsbabel -i garmin_gpi -f ${REFERENCE}/umsonstdraussen.gpi -o gpx,garminextensions -F ${TMPDIR}/umsonstdraussen.gpx compare ${REFERENCE}/umsonstdraussen.gpx ${TMPDIR}/umsonstdraussen.gpx # look for differences between latin1 and windows-1252 -- 2.30.2